package MODEL;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import oracle.jdbc.OracleTypes;

/**
 * Classe de mapeamento da entidade line up
 */
public class LineUpModel extends AbstractModel {
    
    private GregorianCalendar    data;
    private Integer              capacidade;
    private Integer              ingressosVendidos;
    private ArrayList<ShowModel> shows;
    private Integer              totalIngressos;
    private Integer              totalVendidos;
    private Integer              totalPresentes;
    private String               porcVendidosUsados;
    private String               porcVendidosNaoUsados;
    private String               porcNaoVendidos;    
    private Integer              selecionados;
    private CallableStatement    chamada;
    private ResultSet            resultado;
    
    public LineUpModel() { 
        
    }
    
    public LineUpModel(
            GregorianCalendar data,
            Integer capacidade,
            Integer ingressosVendidos) {
        this.data              = data;
        this.capacidade        = capacidade;
        this.ingressosVendidos = ingressosVendidos;
    }
    
    public GregorianCalendar getData() {
        return data;
    }

    public void setData(GregorianCalendar data) {
        this.data = data;
    }

    public Integer getCapacidade() {
        return capacidade;
    }

    public void setCapacidade(Integer capacidade) {
        this.capacidade = capacidade;
    }

    public Integer getIngressosVendidos() {
        return ingressosVendidos;
    }

    public void setIngressosVendidos(Integer ingressosVendidos) {
        this.ingressosVendidos = ingressosVendidos;
    }
    
    public ArrayList<ShowModel> getShows() {
        return shows;
    }

    /**
     * Método busca de shows no banco de dados
     * 
     * @param conexao
     * @return ArrayList<ShowModel> shows;
     * @throws java.sql.SQLException
     */ 
    public ArrayList<ShowModel> getShowsDB(Connection conexao) throws SQLException {        
        try {
            chamada = conexao.prepareCall("call F_GET_SHOWS(?,?)");
            chamada.setDate(1, calendarToDateSQL(this.getData()));
            chamada.registerOutParameter(2, OracleTypes.CURSOR);
            chamada.execute();
            resultado = (ResultSet) chamada.getObject(2);
        } catch (SQLException e) {
            //System.out.println(e.getMessage());
        }        

        shows = new ArrayList<>();
        while (resultado.next()) {
            shows.add(new ShowModel(
                resultado.getString("local"),
                this,
                dataSQLtoCalendar(resultado.getDate("horario_inicio"))
            ));
        }

        return shows;
    }

    public void setShows(ArrayList<ShowModel> shows) {
        this.shows = shows;
    }

    public Integer getTotalIngressos() {
        return totalIngressos;
    }

    public void setTotalIngressos(Integer totalIngressos) {
        this.totalIngressos = totalIngressos;
    }

    public Integer getTotalVendidos() {
        return totalVendidos;
    }

    public void setTotalVendidos(Integer totalVendidos) {
        this.totalVendidos = totalVendidos;
    }

    public Integer getTotalPresentes() {
        return totalPresentes;
    }

    public void setTotalPresentes(Integer totalPresentes) {
        this.totalPresentes = totalPresentes;
    }

    public String getPorcVendidosUsados() {
        return porcVendidosUsados;
    }

    public void setPorcVendidosUsados(String porcVendidosUsados) {
        this.porcVendidosUsados = porcVendidosUsados;
    }

    public String getPorcVendidosNaoUsados() {
        return porcVendidosNaoUsados;
    }

    public void setPorcVendidosNaoUsados(String porcVendidosNaoUsados) {
        this.porcVendidosNaoUsados = porcVendidosNaoUsados;
    }

    public String getPorcNaoVendidos() {
        return porcNaoVendidos;
    }

    public void setPorcNaoVendidos(String porcNaoVendidos) {
        this.porcNaoVendidos = porcNaoVendidos;
    }

    public Integer getSelecionados() {
        return selecionados;
    }

    public void setSelecionados(Integer selecionados) {
        this.selecionados = selecionados;
    }
    
    /**
     * Método geração das informações necessárias para compor o relatório de
     * ingressos
     * 
     * @param conexao
     * @throws java.sql.SQLException
     */     
    public void relatarIngressos(Connection conexao) throws SQLException {
        try {
            chamada = conexao.prepareCall("call F_RELATAR_INGRESSOS(?,?,?,?,?,?,?)");
            chamada.setString(1, calendarToDataString(data));
            chamada.registerOutParameter(2, OracleTypes.NUMBER);
            chamada.registerOutParameter(3, OracleTypes.NUMBER);
            chamada.registerOutParameter(4, OracleTypes.NUMBER);
            chamada.registerOutParameter(5, OracleTypes.VARCHAR);
            chamada.registerOutParameter(6, OracleTypes.VARCHAR);
            chamada.registerOutParameter(7, OracleTypes.VARCHAR);
            chamada.execute();
            totalIngressos         = chamada.getInt(2);
            totalVendidos          = chamada.getInt(3);
            totalPresentes         = chamada.getInt(4);
            porcVendidosUsados     = chamada.getString(5);
            porcVendidosNaoUsados  = chamada.getString(6);
            porcNaoVendidos        = chamada.getString(7);           
        } catch (SQLException e) {
            //System.out.println(e.getMessage());
        }       
    }    
}